package medium.array;

import java.util.Arrays;

/**
 * <a href="https://leetcode-cn.com/problems/3sum-closest">16. 最接近的三数之和</a>
 * 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
 * 示例：
 *   输入：nums = [-1,2,1,-4], target = 1
 *   输出：2
 *   解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
 * 提示：
 *   3 <= nums.length <= 10^3
 *   -10^3 <= nums[i] <= 10^3
 *   -10^4 <= target <= 10^4
 * @author 刘学松
 * @date 2021-03-19 18:49
 */
public class 最接近的三数之和 {
    public int threeSumClosest(int[] nums, int target) {
        int length= nums.length;
        Arrays.sort(nums);
        int best = 10001;
        for (int i = 0; i < length-2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int left = i+1;
            int right = length-1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == target) {
                    return sum;
                }
                if (Math.abs(sum - target) < Math.abs(best - target)) {
                    best = sum;
                }
                if (sum < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
        return best;
    }
}
